{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "9b5104608e11454b94a8167e6850d550",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading readme:   0%|          | 0.00/3.44k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using custom data configuration bigcode--pii-for-code-3fe61a20f3bcbd4c\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading and preparing dataset json/bigcode--pii-for-code to /Users/loubnabenallal/.cache/huggingface/datasets/bigcode___json/bigcode--pii-for-code-3fe61a20f3bcbd4c/0.0.0/e6070c77f18f01a5ad4551a8b7edfba20b8438b7cad4d94e6ad9378022ce4aab...\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f969821d093147489bee104f5cbd42a6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading data files:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "954e6b858e0c4722b6dbc9a973de1e07",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading data:   0%|          | 0.00/3.60M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "83f48e45adb041919b9af62c302ad997",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Extracting data files:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "51b0bce2fe144cc0a69ce3ac0a8b8283",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "0 tables [00:00, ? tables/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset json downloaded and prepared to /Users/loubnabenallal/.cache/huggingface/datasets/bigcode___json/bigcode--pii-for-code-3fe61a20f3bcbd4c/0.0.0/e6070c77f18f01a5ad4551a8b7edfba20b8438b7cad4d94e6ad9378022ce4aab. Subsequent calls will reuse this data.\n"
     ]
    }
   ],
   "source": [
    "from datasets import load_dataset\n",
    "\n",
    "ds = load_dataset(\"bigcode/pii-for-code\", split=\"train\", use_auth_token=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "\n",
    "TAGS = [\"EMAIL\", \"IP_ADDRESS\", \"SSH_KEY\", \"API_KEY\", \"NAME\", \"USERNAME\", \"PASSWORD\", \"AMBIGUOUS\"]\n",
    "\n",
    "def get_pii_list(ds):\n",
    "    list_pii = []\n",
    "    for example in ds:\n",
    "        pii = json.loads(example[\"pii\"])\n",
    "        for sample in pii:\n",
    "            list_pii.append(sample)\n",
    "    return list_pii\n",
    "\n",
    "def get_pii_stats(list_pii):\n",
    "    stats = {}\n",
    "    values = {}\n",
    "    for tag in TAGS:\n",
    "        stats[tag] = 0\n",
    "        values[tag] = []\n",
    "    # iterate over list of pii and count the number of times we see each tag\n",
    "    for sample in list_pii:\n",
    "        for tag in TAGS:\n",
    "            if tag == sample[\"tag\"]:\n",
    "                stats[tag] += 1\n",
    "                values[tag].append(sample[\"value\"])\n",
    "    return {\"stats\": stats, \"values\": values}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1154\n"
     ]
    }
   ],
   "source": [
    "list_pii = get_pii_list(ds)\n",
    "stats = get_pii_stats(list_pii)\n",
    "print(len(list_pii))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "# append lists in values with empty strings to have the same length in all tags\n",
    "# make a deepcopy of values to avoid modifying the original list\n",
    "import copy\n",
    "\n",
    "values = copy.deepcopy(stats[\"values\"])\n",
    "max_len = max([len(values[tag]) for tag in TAGS])\n",
    "for tag in TAGS:\n",
    "    values[tag] += [\"\"] * (max_len - len(values[tag]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "# build hf datasets from values\n",
    "import pandas as pd\n",
    "import datasets\n",
    "\n",
    "df = pd.DataFrame(values)\n",
    "dataset = datasets.Dataset.from_pandas(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Dataset({\n",
       "    features: ['EMAIL', 'IP_ADDRESS', 'SSH_KEY', 'API_KEY', 'NAME', 'USERNAME', 'PASSWORD', 'AMBIGUOUS'],\n",
       "    num_rows: 369\n",
       "})"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e8a1da3a412b488687a8569a3eaa341b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Pushing dataset shards to the dataset hub:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "dataset.push_to_hub(\"loubnabnl/pii-instances\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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KywsLLZ+7NixNkm2xYsXO6wfPHiwTZLthRdecFi/efNmm4+PT7HevPPOOzZJtrfffrvYMbKzs225ubkX/V4AlIxT9oAb8/X1tY/sHD16tMz9vb29HUaaioSEhJT72D4+Pvr73/8uL6/ynaipUaOGxo0b57Cubdu2GjBggDIzM7VixYpy13K55s6dK0maPHmyAgMD7eurVaumKVOmSJJmz55d7HUBAQF66623HHrarFkzde7cWb///ruys7PLPPYnn3yi48ePKy4uTl27dnXY9vzzzysqKkrffPONDhw4cEnvrSQTJkzQhAkTNGbMGN1333267bbbZLPZ9OyzzyoyMrLCjnOxGjZsWOLI7F/+8hdJ0urVq+3rzp49q0WLFqlGjRoaO3asw/6tWrXSo48+Wupx/P39i62rVq1aiesBlA+BFHBztos81TpgwADt27dPzZo10+jRo/XVV18pKyvrko8bFRXlcCPVxWrTpo2uueaaYuuLTjn/97//veSaLtUvv/wiDw+PEk97x8bGytPTs8S6GjdurOrVqxdbX69ePUnSiRMnLurYktSzZ89i27y8vNStWzdJFduX+Ph4xcfHa9KkSUpMTFTXrl310UcfGbvDPicnR6+//rratWunGjVqyMPDQxaLxf7L1qFDh+z77tixQ6dPn1bLli1L/Dnq0qVLsXV33XWXAgMDNWLECN177716//33tW3bNvtnB8Dl4xpSwI3l5eXp+PHjkqTQ0FCn+06bNk0NGzbUBx98oMmTJ2vy5Mny8vJS7969NXXqVDVq1Khcxw4LC7ukmku7zrTo+11OSL5UWVlZCg4Olo+PT7FtXl5eCgkJ0ZEjR4ptK+3a1KJR44uZJ7bo/ZY2K0HR+szMzDK/18VypSCWn5+vnj17auPGjWrevLni4uIUGhoqb29vSefC85kzZ+z7F/WrtJ+jktZHRkZq48aNmjBhgr766istX75c0rlfHEaNGqVnnnmmot8W4HYIpIAbW7dunaxWq6699toyp+rx9PTUs88+q2effVZHjhzRunXrtHjxYi1dulTbtm3Ttm3b5Ovre9HHvtSbX/74448S12dkZEg6d0q/iIfHuZNAVqu12P4VGdBq1Kih48ePKz8/3x6EilitVh07dqzEkdCKOrb0/9//hYrusj+/L1eTTz75RBs3btSgQYOKzU6Qnp6u+Ph4h3VFfw+l/RyVtr5p06ZasmSJrFartmzZov/85z/65z//qZEjR6patWp6/PHHK+DdAO6LU/aAmyosLNRrr70mSerfv3+5Xlu7dm3dc889SkhIUM+ePbV792799ttv9u2enp5X7ClQv/zyi06dOlVsfdHUTjExMfZ1NWvWlCSlpaUV2//nn38u8fsXXc9ZnvpjYmJUWFio7777rti27777TgUFBWrTps1Ff7/yKHq/JU1tZbVatXbtWkm6YsevDM7+Tnbt2iVJuueee4ptK5ou6nxNmjSRv7+/fv311xJ/jtatW+e0Fi8vL91www3629/+pkWLFkmSVq5cWeZ7AOAcgRRwQ0eOHNGDDz6o5ORk1a9fXy+99JLT/c+cOaP169cXW5+fn28/5R8QEGBfX6tWLR09elSnT5+u2MJ17pTrxIkTHdb9/PPPWrBggWrUqKF+/frZ17dv316S9MEHHziMkqalpRX7HufXLqlcNwENHjxYkjR69GiHpzjl5ubaH8l5pUbQiuZjXbRokX744QeHbW+//bb27t2rm2++uUpP6O/s76RoZP/CQL5nzx797W9/K7a/j4+P4uLilJWVpVdffdVh25YtWzR//vxir9m0aVOJl4IUjaae/7MP4NJwyh64yhVN8F1YWGh/dOi6det09uxZtW/fXgsWLCjzLvnTp0+rS5cuatSokW644QZFRkYqLy9P33zzjX7//Xfdddddatq0qX3/m266ST/99JNuu+02devWTb6+vmrVqpXuvPPOy34/3bp10+zZs/Xjjz+qc+fO9nlICwsLNXPmTIdT4x06dFC3bt303XffqX379urZs6f++OMPffbZZ+rVq1eJI6c33XST3nzzTQ0dOlT33nuvrrnmGgUFBenPf/5zqTX1799fn3zyiRISEnT99derb9++slgsWrlypfbu3au4uDgNGDDgst97SQIDAzV37lzdf//9io2N1f3336/69etr06ZN+vrrrxUWFqaZM2dekWNXlptuuklLly7VPffco969e8vf31+RkZF65JFHdOedd6pRo0Z66623tHXrVsXExOjAgQP6/PPPdccdd5QYYidPnqzExES98cYb+vHHH9WpUyelp6crISFBvXv31sqVK+2Xe0jSRx99pJkzZ6pLly667rrrVLNmTe3evVufffaZfH19HebbBXCJzM46BeBK0f/N9Vj0x8fHx1arVi1bmzZtbEOGDLF9+eWXtoKCghJfe+G8j2fPnrVNmTLFdtttt9nq1atn8/X1tYWEhNg6dOhge/fdd21nzpxxeH12drZt2LBhtjp16tg8PT2LzfcpyRYbG1tq7c7mIR04cKAtJSXFdtddd9mCgoJs/v7+tk6dOtm++uqrEr/XiRMnbEOGDLGFhobafHx8bNdff71t5syZpc5DarPZbFOnTrU1adLEPifl+XOqljYnZkFBgW3GjBm2G264webv72/z9/e3tWnTxjZ9+vQS++ysB2XNhVqSjRs32vr27WsLCQmxeXt72+rVq2cbNmyY7dChQ8X2reh5SMu7f3m/j9VqtY0ePdrWoEED+7y55/fuwIEDtv79+9siIiJsfn5+tmbNmtmmTJliy8/PL7XPBw8etD366KO2kJAQm5+fn61Vq1a2Dz/80LZ06VKbJNu0adPs+/7www+2YcOG2Vq2bGmrWbOmzc/Pz3bdddfZBg0aZNu6detFvw8ApbPYbC50uyQAAAaNGTNGr7/+ur766iv16tXLdDmA2yCQAgDczuHDhxUREeGwbuvWrerUqZN8fHx06NAh+fn5GaoOcD9cQwoAcDtt27ZVo0aN1Lx5c1WrVk07d+7UF198Yb8WmTAKVC5GSAEAbic+Pl4rV67Uvn37dOrUKQUFBaljx44aNWpUiU/cAnBlEUgBAABgFPOQAgAAwCgCKQAAAIwikAIAAMAoAikAAACMqtLTPp04ccLh+dRXm9DQUB09etR0GS6L/pSNHjlHf5yjP87Rn7LRI+eu9v54eXmpZs2aF7fvFa7lirJarcrPzzddxhVhsVgknXuPTIRQHP0pGz1yjv44R3+coz9lo0fO0R9HnLIHAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFFepguoKgqG3lXpx0yr9CNKnrM+NXBUAADgzhghBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABjlVZ6dv/76a3399dc6evSoJKlu3bq67777FBMTI0maMGGCUlJSHF5z880364knnrAvHzt2TLNmzdK2bdvk5+en2NhY9e/fX56enpf7XgAAAFAFlSuQBgcHq3///goPD5fNZtOaNWv0xhtv6I033lC9evUkSTfddJPi4uLsr/Hx8bF/XVhYqEmTJikoKEivvvqqTpw4oenTp8vT01P9+/evoLcEAACAqqRcp+zbtm2rNm3aKDw8XBEREXrooYfk5+ennTt32vfx9fVVUFCQ/U9AQIB925YtW3Tw4EE9/fTTioqKUkxMjOLi4rR69WpZrdaKe1cAAACoMso1Qnq+wsJCff/99zpz5oyio6Pt69euXau1a9cqKChIN9xwg+699175+vpKklJTU1W/fn0FBQXZ92/durVmz56ttLQ0NWjQoMRj5efnKz8/375ssVjk7+9v/xoVp6r0s6jOqlKvCfTIOfrjHP1xjv6UjR45R38clTuQHjhwQGPGjFF+fr78/Pw0atQo1a1bV5LUpUsXhYSEKDg4WPv379eCBQt0+PBhjRo1SpKUmZnpEEYlqUaNGvZtpVmxYoWWLVtmX27QoIGmTJmi0NDQ8pZ/ydIq7UhmhYeHmy6hXMLCwkyX4PLokXP0xzn64xz9KRs9co7+nFPuQBoREaE333xTubm5+uGHHzRjxgzFx8erbt26uvnmm+371a9fXzVr1tTEiROVkZFxWQ3v16+f+vTpY18u+m3i6NGjnOqvYOnp6aZLuCgWi0VhYWHKyMiQzWYzXY5LokfO0R/n6I9z9Kds9Mg5d+iPl5fXRQ8eljuQenl52cNlw4YNtXv3bq1atcrhTvoijRo1kiR7IA0KCtKuXbsc9snKypKkYiOn5/P29pa3t3eJ267Wv0RTqlo/bTZblau5stEj5+iPc/THOfpTNnrkHP0557LnIS0sLHS4vvN8+/btkyTVrFlTkhQdHa0DBw7YQ6gk/frrr/L397ef9gcAAIB7KdcI6cKFC9W6dWuFhIQoLy9P69atU0pKisaMGaOMjAytW7dObdq0UWBgoA4cOKB58+apadOmioyMlCS1atVKdevW1fTp0zVgwABlZmZq8eLF6tWrV6kjoAAAALi6lSuQZmVlacaMGTpx4oQCAgIUGRmpMWPGqGXLljp27Ji2bt2qVatW6cyZM6pVq5Y6dOige+65x/56Dw8Pvfjii5o9e7bGjh0rX19fxcbGOsxbCgAAAPdSrkD61FNPlbotJCRE8fHxZX6P0NBQjR49ujyHBQAAwFWMZ9kDAADAKAIpAAAAjCKQAgAAwCgCKQAAAIwikAIAAMAoAikAAACMIpACAADAKAIpAAAAjCKQAgAAwCgCKQAAAIwikAIAAMAoAikAAACMIpACAADAKAIpAAAAjCKQAgAAwCgCKQAAAIwikAIAAMAoAikAAACMIpACAADAKAIpAAAAjCKQAgAAwCgCKQAAAIwikAIAAMAoAikAAACMIpACAADAKAIpAAAAjCKQAgAAwCgCKQAAAIwikAIAAMAoAikAAACMIpACAADAKAIpAAAAjCKQAgAAwCgCKQAAAIwikAIAAMAoAikAAACMIpACAADAKAIpAAAAjCKQAgAAwCiv8uz89ddf6+uvv9bRo0clSXXr1tV9992nmJgYSdLZs2c1f/58bdiwQfn5+WrVqpWGDBmioKAg+/c4duyYZs2apW3btsnPz0+xsbHq37+/PD09K+5dwYiCoXdV6vHSKvVo53jO+tTAUQEAuLqVK5AGBwerf//+Cg8Pl81m05o1a/TGG2/ojTfeUL169TRv3jz98ssveu655xQQEKA5c+Zo6tSpeuWVVyRJhYWFmjRpkoKCgvTqq6/qxIkTmj59ujw9PdW/f/8r8gYBAADg2sp1yr5t27Zq06aNwsPDFRERoYceekh+fn7auXOncnNzlZiYqIEDB6p58+Zq2LChhg8frh07dig1NVWStGXLFh08eFBPP/20oqKiFBMTo7i4OK1evVpWq/WKvEEAAAC4tnKNkJ6vsLBQ33//vc6cOaPo6Gjt2bNHBQUFatGihX2fOnXqKCQkRKmpqYqOjlZqaqrq16/vcAq/devWmj17ttLS0tSgQYMSj5Wfn6/8/Hz7ssVikb+/v/1rVBz66VxV6k9RrVWp5spEf5yjP87Rn7LRI+foj6NyB9IDBw5ozJgxys/Pl5+fn0aNGqW6detq37598vLyUrVq1Rz2r1GjhjIzMyVJmZmZDmG0aHvRttKsWLFCy5Ytsy83aNBAU6ZMUWhoaHnLv2Qmrlc0ITw8/JJf6w49upz+mBIWFma6BJdGf5yjP87Rn7LRI+fozznlDqQRERF68803lZubqx9++EEzZsxQfHz8lajNrl+/furTp499uei3iaNHj3Kqv4Klp6ebLsGlVaX+WCwWhYWFKSMjQzabzXQ5Lof+OEd/nKM/ZaNHzrlDf7y8vC568LDcgdTLy8ue5hs2bKjdu3dr1apV6tSpk6xWq3JychxGSbOysuyjokFBQdq1a5fD98vKyrJvK423t7e8vb1L3Ha1/iWaQj+dq4r9sdlsVbLuykJ/nKM/ztGfstEj5+jPOZc9D2lhYaHy8/PVsGFDeXp6auvWrfZthw8f1rFjxxQdHS1Jio6O1oEDB+whVJJ+/fVX+fv7q27dupdbCgAAAKqgco2QLly4UK1bt1ZISIjy8vK0bt06paSkaMyYMQoICFDPnj01f/58BQYGKiAgQHPnzlV0dLQ9kLZq1Up169bV9OnTNWDAAGVmZmrx4sXq1atXqSOgAAAAuLqVK5BmZWVpxowZOnHihAICAhQZGakxY8aoZcuWkqSBAwfKYrFo6tSpslqt9onxi3h4eOjFF1/U7NmzNXbsWPn6+io2NlZxcXEV+64AAABQZZQrkD711FNOt/v4+GjIkCEOIfRCoaGhGj16dHkOCwAAgKsYz7IHAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGOVVnp1XrFihjRs36tChQ/Lx8VF0dLQefvhhRURE2PeZMGGCUlJSHF53880364knnrAvHzt2TLNmzdK2bdvk5+en2NhY9e/fX56enpf5dgAAAFDVlCuQpqSkqFevXrruuutUUFCgRYsW6dVXX9Vbb70lPz8/+3433XST4uLi7Ms+Pj72rwsLCzVp0iQFBQXp1Vdf1YkTJzR9+nR5enqqf//+FfCWAAAAUJWU65T9mDFj1L17d9WrV09RUVEaMWKEjh07pj179jjs5+vrq6CgIPufgIAA+7YtW7bo4MGDevrppxUVFaWYmBjFxcVp9erVslqtFfOuAAAAUGVc1jWkubm5kqTAwECH9WvXrtXjjz+u559/XgsXLtSZM2fs21JTU1W/fn0FBQXZ17Vu3VqnT59WWlra5ZQDAACAKqhcp+zPV1hYqA8//FB/+tOfVL9+ffv6Ll26KCQkRMHBwdq/f78WLFigw4cPa9SoUZKkzMxMhzAqSTVq1LBvK0l+fr7y8/PtyxaLRf7+/vavUXHop3NVqT9FtValmisT/XGO/jhHf8pGj5yjP44uOZDOmTNHaWlpmjhxosP6m2++2f51/fr1VbNmTU2cOFEZGRkKCwu7pGOtWLFCy5Ytsy83aNBAU6ZMUWho6KUVfwncZew2PDz8kl/rDj26nP6YcqmfO3dBf5yjP87Rn7LRI+fozzmXFEjnzJmjX375RfHx8apVq5bTfRs1aiRJ9kAaFBSkXbt2OeyTlZUlScVGTov069dPffr0sS8X/TZx9OhRrjutYOnp6aZLcGlVqT8Wi0VhYWHKyMiQzWYzXY7LoT/O0R/n6E/Z6JFz7tAfLy+vix48LFcgtdlsmjt3rjZu3KgJEyaodu3aZb5m3759kqSaNWtKkqKjo7V8+XJlZWXZT9X/+uuv8vf3V926dUv8Ht7e3vL29i61JlQc+ulcVeyPzWarknVXFvrjHP1xjv6UjR45R3/OKVcgnTNnjtatW6cXXnhB/v7+9ms+AwIC5OPjo4yMDK1bt05t2rRRYGCgDhw4oHnz5qlp06aKjIyUJLVq1Up169bV9OnTNWDAAGVmZmrx4sXq1atXqaETAAAAV69yBdKvv/5a0rnJ7883fPhwde/eXV5eXtq6datWrVqlM2fOqFatWurQoYPuuece+74eHh568cUXNXv2bI0dO1a+vr6KjY11mLcUAAAA7qNcgTQhIcHp9pCQEMXHx5f5fUJDQzV69OjyHBoAAABXKZ5lDwAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjvMqz84oVK7Rx40YdOnRIPj4+io6O1sMPP6yIiAj7PmfPntX8+fO1YcMG5efnq1WrVhoyZIiCgoLs+xw7dkyzZs3Stm3b5Ofnp9jYWPXv31+enp4V9sYAAABQNZRrhDQlJUW9evXSa6+9prFjx6qgoECvvvqq8vLy7PvMmzdPmzZt0nPPPaf4+HidOHFCU6dOtW8vLCzUpEmTZLVa9eqrr2rEiBFKTk7WkiVLKu5dAQAAoMooVyAdM2aMunfvrnr16ikqKkojRozQsWPHtGfPHklSbm6uEhMTNXDgQDVv3lwNGzbU8OHDtWPHDqWmpkqStmzZooMHD+rpp59WVFSUYmJiFBcXp9WrV8tqtVb8OwQAAIBLK9cp+wvl5uZKkgIDAyVJe/bsUUFBgVq0aGHfp06dOgoJCVFqaqqio6OVmpqq+vXrO5zCb926tWbPnq20tDQ1aNCg2HHy8/OVn59vX7ZYLPL397d/jYpDP52rSv0pqrUq1VyZ6I9z9Mc5+lM2euQc/XF0yYG0sLBQH374of70pz+pfv36kqTMzEx5eXmpWrVqDvvWqFFDmZmZ9n3OD6NF24u2lWTFihVatmyZfblBgwaaMmWKQkNDL7X8ckurtCOZFR4efsmvdYceXU5/TAkLCzNdgkujP87RH+foT9nokXP055xLDqRz5sxRWlqaJk6cWJH1lKhfv37q06ePfbnot4mjR49ymr+Cpaenmy7BpVWl/lgsFoWFhSkjI0M2m810OS6H/jhHf5yjP2WjR865Q3+8vLwuevDwkgLpnDlz9Msvvyg+Pl61atWyrw8KCpLValVOTo7DKGlWVpZ9VDQoKEi7du1y+H5ZWVn2bSXx9vaWt7d3iduu1r9EU+inc1WxPzabrUrWXVnoj3P0xzn6UzZ65Bz9OadcNzXZbDbNmTNHGzdu1Lhx41S7dm2H7Q0bNpSnp6e2bt1qX3f48GEdO3ZM0dHRkqTo6GgdOHDAHkIl6ddff5W/v7/q1q17Oe8FAAAAVVC5RkjnzJmjdevW6YUXXpC/v7/9ms+AgAD5+PgoICBAPXv21Pz58xUYGKiAgADNnTtX0dHR9kDaqlUr1a1bV9OnT9eAAQOUmZmpxYsXq1evXqWOggIAAODqVa5A+vXXX0uSJkyY4LB++PDh6t69uyRp4MCBslgsmjp1qqxWq31i/CIeHh568cUXNXv2bI0dO1a+vr6KjY1VXFzc5b0TAAAAVEnlCqQJCQll7uPj46MhQ4Y4hNALhYaGavTo0eU5NAAAAK5SPMseAAAARhFIAQAAYBSBFAAAAEYRSAEAAGDUZT3LHsDFKxh6V6Uf08TjXD1nfWrgqACAqowRUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUQRSAAAAGEUgBQAAgFEEUgAAABhFIAUAAIBRBFIAAAAYRSAFAACAUV7lfUFKSoo+/fRT7d27VydOnNCoUaPUvn17+/YZM2ZozZo1Dq9p1aqVxowZY1/Ozs7W3LlztWnTJlksFnXo0EGPPfaY/Pz8LuOtAAAAoCoqdyA9c+aMoqKi1LNnT/39738vcZ/WrVtr+PDh//8gXo6Heeedd3TixAmNHTtWBQUF+te//qWZM2dq5MiR5S0HAAAAVVy5A2lMTIxiYmKcf1MvLwUFBZW47eDBg9q8ebMmTZqk6667TpI0ePBgTZo0SY888oiCg4PLWxIAAACqsHIH0ouRkpKiIUOGqFq1amrevLkefPBBXXPNNZKk1NRUVatWzR5GJalFixayWCzatWuXw+n/Ivn5+crPz7cvWywW+fv7279GxaGfztGfslWVHhXVWVXqrWz0xzn6UzZ65Bz9cVThgbR169bq0KGDateurYyMDC1atEivv/66XnvtNXl4eCgzM1PVq1d3eI2np6cCAwOVmZlZ4vdcsWKFli1bZl9u0KCBpkyZotDQ0Iouv1RplXYks8LDwy/5te7QI/pTtsvpkQlhYWGmS3Bp9Mc5+lM2euQc/TmnwgNp586d7V/Xr19fkZGRevrpp7Vt2za1aNHikr5nv3791KdPH/ty0W8TR48eldVqvbyC4SA9Pd10CS6N/pStqvTIYrEoLCxMGRkZstlspstxOfTHOfpTNnrknDv0x8vL66IHD6/IKfvzXXvttbrmmmuUkZGhFi1aKCgoSCdPnnTYp6CgQNnZ2aVed+rt7S1vb+8St12tf4mm0E/n6E/ZqlqPbDZblau5MtEf5+hP2eiRc/TnnCs+D+n//vc/ZWdnq2bNmpKk6Oho5eTkaM+ePfZ9fvvtN9lsNjVq1OhKlwMAAAAXU+4R0ry8PGVkZNiXjxw5on379ikwMFCBgYFaunSpOnTooKCgIP3xxx/697//rbCwMLVq1UqSVLduXbVu3VozZ87U0KFDZbVaNXfuXHXq1Ik77AEAANxQuQPp7t27FR8fb1+eP3++JCk2NlZDhw7VgQMHtGbNGuXk5Cg4OFgtW7ZUXFycwyn3Z555RnPmzNHEiRPtE+MPHjy4At4OAAAAqppyB9Lrr79eCQkJpW4//4lMpQkMDGQSfAAAAEjiWfYAAAAwjEAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAo7zK+4KUlBR9+umn2rt3r06cOKFRo0apffv29u02m00JCQn69ttvlZOToyZNmmjIkCEKDw+375Odna25c+dq06ZNslgs6tChgx577DH5+flVzLsCAABAlVHuEdIzZ84oKipKjz/+eInbP/nkE3355ZcaOnSoXn/9dfn6+uq1117T2bNn7fu88847SktL09ixY/Xiiy/q999/18yZMy/9XQAAAKDKKncgjYmJ0YMPPugwKlrEZrNp1apVuueee9SuXTtFRkbqz3/+s06cOKGffvpJknTw4EFt3rxZw4YNU+PGjdWkSRMNHjxYGzZs0PHjxy//HQEAAKBKqdBrSI8cOaLMzEy1bNnSvi4gIECNGjVSamqqJCk1NVXVqlXTddddZ9+nRYsWslgs2rVrV0WWAwAAgCqg3NeQOpOZmSlJqlGjhsP6GjVq2LdlZmaqevXqDts9PT0VGBho3+dC+fn5ys/Pty9bLBb5+/vbv0bFoZ/O0Z+yVZUeFdVZVeqtbPTHOfpTNnrkHP1xVKGB9EpZsWKFli1bZl9u0KCBpkyZotDQ0EqrIa3SjmTW+TeflZc79Ij+lO1yemRCWFiY6RJcGv1xjv6UjR45R3/OqdBAGhQUJEnKyspSzZo17euzsrIUFRVl3+fkyZMOrysoKFB2drb99Rfq16+f+vTpY18u+m3i6NGjslqtFfcGoPT0dNMluDT6U7aq0iOLxaKwsDBlZGTIZrOZLsfl0B/n6E/Z6JFz7tAfLy+vix48rNBAWrt2bQUFBWnr1q32AJqbm6tdu3bp1ltvlSRFR0crJydHe/bsUcOGDSVJv/32m2w2mxo1alTi9/X29pa3t3eJ267Wv0RT6Kdz9KdsVa1HNputytVcmeiPc/SnbPTIOfpzTrkDaV5enjIyMuzLR44c0b59+xQYGKiQkBD17t1by5cvV3h4uGrXrq3FixerZs2aateunSSpbt26at26tWbOnKmhQ4fKarVq7ty56tSpk4KDgyvunQEAAKBKKHcg3b17t+Lj4+3L8+fPlyTFxsZqxIgRuvvuu3XmzBnNnDlTubm5atKkiV566SX5+PjYX/PMM89ozpw5mjhxon1i/MGDB1fA2wEAAEBVU+5Aev311yshIaHU7RaLRXFxcYqLiyt1n8DAQI0cObK8hwZwFSsYelelH9PEjWaesz41cFQAcG08yx4AAABGEUgBAABgFIEUAAAARhFIAQAAYBSBFAAAAEYRSAEAAGAUgRQAAABGEUgBAABgFIEUAAAARhFIAQAAYBSBFAAAAEYRSAEAAGAUgRQAAABGEUgBAABglJfpAgAAZSsYelelHzOt0o8oec761MBRAZjGCCkAAACMIpACAADAKAIpAAAAjCKQAgAAwCgCKQAAAIwikAIAAMAoAikAAACMIpACAADAKAIpAAAAjCKQAgAAwCgCKQAAAIwikAIAAMAoAikAAACMIpACAADAKAIpAAAAjCKQAgAAwCgCKQAAAIzyMl0AAAAVoWDoXZV6vLRKPdo5nrM+NXBU4MpjhBQAAABGEUgBAABgFIEUAAAARhFIAQAAYBSBFAAAAEYRSAEAAGBUhU/7lJCQoGXLljmsi4iI0Ntvvy1JOnv2rObPn68NGzYoPz9frVq10pAhQxQUFFTRpQAAAKAKuCLzkNarV08vv/yyfdnD4/8PxM6bN0+//PKLnnvuOQUEBGjOnDmaOnWqXnnllStRCgAAAFzcFTll7+HhoaCgIPuf6tWrS5Jyc3OVmJiogQMHqnnz5mrYsKGGDx+uHTt2KDU19UqUAgAAABd3RUZIMzIy9OSTT8rb21vR0dHq37+/QkJCtGfPHhUUFKhFixb2fevUqaOQkBClpqYqOjq6xO+Xn5+v/Px8+7LFYpG/v7/9a1Qc+ukc/SkbPXKO/jhHf5yrSv0pqrUq1VyZ6I+jCg+kjRs31vDhwxUREaETJ05o2bJlGjdunKZOnarMzEx5eXmpWrVqDq+pUaOGMjMzS/2eK1ascLgutUGDBpoyZYpCQ0MruvxSmXhEnAnh4eGX/Fp36BH9Kdul9oj+OEd/yuYOPbqc/pgSFhZmugSXRn/OqfBAGhMTY/86MjLSHlC///57+fj4XNL37Nevn/r06WNfLvpt4ujRo7JarZdXMBykp6ebLsGl0Z+y0SPn6I9z9Me5y+mPdcidFViJ6/Ka/ZnpEi6KxWJRWFiYMjIyZLPZTJdzRXh5eV304OEVOWV/vmrVqikiIkIZGRlq2bKlrFarcnJyHEZJs7KynN5l7+3tLW9v7xK3Xa1/iabQT+foT9nokXP0xzn64xz9KVtV65HNZqtyNV8JV3we0ry8PGVkZCgoKEgNGzaUp6entm7dat9++PBhHTt2rNTrRwEAAHB1q/AR0vnz56tt27YKCQnRiRMnlJCQIA8PD3Xp0kUBAQHq2bOn5s+fr8DAQAUEBGju3LmKjo4mkAIAALipCg+kx48f1z/+8Q+dOnVK1atXV5MmTfTaa6/Zp34aOHCgLBaLpk6dKqvVap8YHwAAAO6pwgPps88+63S7j4+PhgwZQggFAACAJJ5lDwAAAMMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMIpACgAAAKMIpAAAADCKQAoAAACjCKQAAAAwikAKAAAAowikAAAAMMrLdAEAAACmFQy9q9KPmVbpR5Q8Z31q4KhlY4QUAAAARhFIAQAAYJSxU/ZfffWVPvvsM2VmZioyMlKDBw9Wo0aNTJUDAAAAQ4yMkG7YsEHz58/XfffdpylTpigyMlKvvfaasrKyTJQDAAAAg4wE0s8//1w33XSTevToobp162ro0KHy8fFRUlKSiXIAAABgUKWfsrdardqzZ4/69u1rX+fh4aEWLVooNTW1xNfk5+crPz/fvmyxWOTv7y8vr8or3+O6P1XasUzy9Pa+5Ne6Q4/oT9kutUf0xzn6UzZ36BH9KRufMecu52eovMqT0yw2m812BWsp5vjx4xo2bJheffVVRUdH29f/+9//VkpKil5//fVir0lISNCyZcvsy507d9bIkSMrpV4AAABcWVXiLvt+/frpww8/tP8ZOnSow4jp1ej06dP629/+ptOnT5suxSXRn7LRI+foj3P0xzn6UzZ65Bz9cVTpp+yrV68uDw8PZWZmOqzPzMxUUFBQia/x9vaWdyUOMbsCm82mvXv3qpIHsKsM+lM2euQc/XGO/jhHf8pGj5yjP44qfYTUy8tLDRs21G+//WZfV1hYqN9++83hFD4AAADcg5F5SPv06aMZM2aoYcOGatSokVatWqUzZ86oe/fuJsoBAACAQUYCaadOnXTy5EklJCQoMzNTUVFReumll0o9Ze+OvL29dd9997ndpQoXi/6UjR45R3+coz/O0Z+y0SPn6I+jSr/LHgAAADhflbjLHgAAAFcvAikAAACMIpACAADAKAIpAAAAjCKQAgAAwCgCKQC4sbfeekvZ2dmmywCuanzOykYgBdzAoUOHNHLkSNNluJSzZ88qOTlZq1evVnp6uulyjDl+/Lief/55/fLLL6ZLcVmpqanatGmTw7o1a9ZoxIgRGjJkiGbOnKn8/HxD1aEq4HNWNgKpi5g9e7by8vLsy+vWrXNYzsnJ0aRJk0yU5hL+8pe/OPx2OXv2bJ08edK+nJWVpYcffthEaVVCfn6+MjIyTJdhzLx58zR37lz7stVq1dixYzVz5kwtWrRIL7zwglJTUw1WaM4rr7yiO+64Q2+99Zbee+89h393cM6yZcuUlpZmXz5w4IDee+89tWjRQn379tWmTZu0YsUKgxW6jvT0dH366aeaM2eO5s6dq88//1x//PGH6bKM43NWNiNPakJx33zzje6//375+flJkmbNmqXGjRvbl/Pz87V582aDFZp1+PBhFRQU2JfXrl2rO++8U9WrV5ck2Ww2RihQql9//VUPPfSQfXnt2rU6evSo3nnnHYWEhOjdd9/Vxx9/rNGjRxus0gyLxaK77rpLN9xwg/71r3/p+eef1+233y4PD8fxit69exuq0Lx9+/YpLi7Ovrx+/Xo1atRIw4YNkyTVqlVLCQkJeuCBB0yV6BJWrFihhIQEFRYWqkaNGrLZbDp58qQWLFighx56SHfddZfpEo3hc1Y2AqmL4gFaztEflMexY8dUt25d+/KWLVvUsWNHhYaGSjr3n4A7n4GQpDp16qhnz56aNWuWvvjiC4f/KC0Wi1v/R5mTk6MaNWrYl1NSUhQTE2Nfvu666/S///3PRGku47ffftPixYt17733qnfv3goMDJQkZWdn64svvtDChQvVqFEjNWvWzHClZvE5Kx2BFMBVz2KxOPwSs3PnTt1777325YCAALe+4SAzM1PvvfeeduzYoWHDhql79+6mS3IpNWrU0JEjRxQSEiKr1aq9e/c6jIbm5eXJ09PTYIXmffPNN7rpppuKjRIHBgYqLi5OmZmZ+vrrr906kPI5c45AiirDYrE4XXZnjz32mNPthYWFlVSJa6pTp442bdqkPn36KC0tTceOHVPz5s3t248dO6agoCBzBRq0fv16zZ07V1FRUXrzzTcVEhJiuiSXExMTo4ULF2rAgAH66aef5Ovrq6ZNm9q379+/X2FhYQYrNG/Xrl16+umnS93erVs3TZ8+vRIrci18zspGIHUhS5Yska+vr6RzN10sX75cAQEBkqQzZ86YLM0lTJw40T4KcfbsWU2ZMkVeXud+hM+/vtQdDRw40HQJLu3uu+/W22+/rV9++UVpaWmKiYlR7dq17dt/+eUXXXfddQYrNOe9995T//79dfvtt5suxWXFxcVp6tSpmjBhgvz8/DRixAj7vz2SlJSUpJYtWxqs0LysrCz7JTAlqV27tjIzMyuvIBfD56xsFhsX47mECRMmXNSI3/jx4yuhGtezdOnSi9rv/vvvv8KVoKraunWrNm3apKCgIN1+++32X/6kcz9fzZo10/XXX2+wQjPS09MVHh5uuowqITc3V35+fsVuRMnOzpafn59DSHU3cXFxev/99x2utT1fZmamnnzySS1ZsqSSK3MNfM7KRiAFADc2e/ZsPfzww/YZPdatW6e2bdval3NycvTOO++45QwEuHhxcXGKi4uz/9xcKC8vT0uWLHHbQMrnrGzu++sccBUp6xrSIh988MEVrsQ1nTx5UmfOnHE4pZiWlqbPPvtMeXl5at++vbp06WKwQnOYcq5sL7zwQolnsAICAhQeHq7evXs7zOLgjkJCQvTtt9+WuY+74nNWNgKpi1i2bNlF7Xffffdd4UpcU3x8/EXt566XNHANqXNz585VcHCwHn30UUnnrncbN26cgoODde2112rGjBkqLCxUt27dDFdqHifNimvXrl2J63NycrR371698MILGjdunJo0aVLJlbmOGTNmmC6hSuFzVhyB1EUsXbpUNWvWtE8mXBKLxeK2gTQlJUUhISFq06aN20+vUpKLmT7Ene+037lzp0aMGGFfXrNmjQIDA/XGG2/I09NTn376qVavXk0gRYnKujZ90aJFSkhI0Lhx4yqpoqrp+PHjCg4ONl0GXBSB1EW0bt1av/32mxo2bKiePXuqTZs2xS6cd2cDBgxQUlKSfvjhB3Xp0kU9evRQ/fr1TZdVJRw+fFiJiYn67rvv9P7775sux4jMzEyH0/Xbtm1Thw4d7L/ctG3bVitXrjRUHaq6Ll26lHm62p1lZmZq+fLlSkxM1L///W/T5cBFEUhdxOjRo3X8+HGtWbNGH330kd5//31169ZNPXv2VEREhOnyjLvrrrt01113KTU1VYmJiXr55ZcVERGhHj16qEuXLvbpsXDOmTNntGHDBiUlJSk1NVXXXXed+vTpY7osYwICApSTk2MPpbt27VKPHj3s2y0Wi1s/epYp5y6Ph4eH25+Czc7O1uzZs7V161Z5eXnp7rvv1m233aalS5fqs88+U2RkpIYPH266TKP4nDlHIHUhwcHB6tevn/r166eUlBQlJydr9OjRql+/vl5++WX5+PiYLtG46OhoRUdH67HHHtP333+v1atX66OPPtLMmTMJpZI9sH///fcKCQnRoUOHNH78eIdJvN1R48aN9eWXX+rJJ5/Uxo0bdfr0aYeJ8dPT0932houmTZsqPT3dvvynP/1JR44ccdjHnZ+uczF+/PFHt7+paeHChUpNTVVsbKy2bNmiefPmacuWLbJYLBo3bpyio6NNl2gUn7OyEUhdVKNGjXT06FEdPHhQe/fuldVqJZCeZ+/evUpJSdGhQ4dUv359t57/T5I+++wzJSUlKTc3V507d1Z8fLyioqL00EMP6ZprrjFdnnFxcXGaOHGi1q5dq4KCAvXr18/+rG3p3FNU3DW0T5gwocx9rFbrlS/Eha1atarE9bm5udqzZ4/++9//uvV0PZL03//+VyNGjFDz5s115MgRPf3004qMjFT//v1Nl+YS+JyVzb3/F3dB549wRUREqHv37pyS/j/Hjx9XcnKy1qxZo9zcXHXt2lWvv/66249MSNKCBQt09913Ky4ujmuPSxAZGalp06Zpx44dCgoKUuPGjR22d+7c2W1/jjZs2KBOnTqVur2goEBvv/22Ro0aVYlVuZYvvviixPVF0z7Fx8e7/QjgiRMnVKdOHUnnnsrk7e3NTYLn4XNWNgKpi/jkk0+UnJysU6dOqUuXLpo4caIiIyNNl+UyJk2apN9++02tWrXSww8/zN32F4iLi1NycrK+++47de7cWd26deOmrwtUr1691Ol72rRpU8nVuI4ZM2YoMDCwxEdfFhQUaNq0aUpNTTVQmetgSqOy2Ww2h3+TPTw8OKt3Hj5nZeNJTS4iLi7OPq2Rs9PP7jrfZFxcnIKCglSjRg2nj1idMmVKJVblelJSUpSYmKgff/xRYWFhSktL04QJE9x6fkTp3C80I0eOtJ9pWLlypW655RZVq1ZNknTq1CmNGzdO06ZNM1mmEatWrdLixYv18ssvO4wcFxYW6q233tKOHTs0btw41atXz2CVruXkyZOSzv2Sg3Pi4uJUr149eyjdv3+/6tSpU+z/M3f9N5rPWdkYIXURTZs2lcVi0cGDB02X4pLcdf7V8mrWrJmaNWumxx9/XOvWrVNSUpImTJigRo0aqWPHjm57p/3mzZsd7qJfsWKFbrzxRnsgLSgo0OHDh02VZ1Tv3r2VnZ2tSZMmKT4+XvXq1VNhYaGmTZum7du3u/1/kkVycnK0aNEiff/998rOzpYkBQYGqlOnTnrwwQftP0vu6sJ/o9u2bWuoEtfE56xsBFIXcTEXPLuzsiamhiN/f3/dcsstuuWWW3TgwAElJiZq5cqVbhtIL8SJIUcPPPCAsrOz9eqrr2r8+PFavHixUlJSNG7cOC790LkpjcaMGaPjx4+ra9eu9mslDx48qOTkZP3222965ZVXHG6Uczf8G102PmfOEUiriIMHDyoxMdH+6EP8f7m5uVq3bp0SExM1efJk0+W4nPr162vQoEF6+OGHTZcCFzZ48GBlZ2frr3/9q/z8/DRu3DiuY/8/y5Ytk5eXl/75z38qKCjIYVtcXJxeffVVLVu2TIMGDTJSn6vZv3+/fYqj8PBwfo7Ow+esdARSF5aXl6cNGzYoMTFRO3fudNu7gEvz22+/KSkpSRs3blRAQECpN6y4gzVr1pS5j8Viceu7Xi+89tjZtcjuZN68efavi0b4oqKilJyc7LCfu16/Lkk//fSThg4dWiyMSlJQUJAefvhhzZo1y+0D6a5du/Tuu+8Wu/SsXr16GjZsmBo1amSoMvP4nJWNQOqCtm/fbp/66ezZs7rjjjv01FNP2U8TubOiqZ+K5tzMzs7WyJEjdeONN7p1wPjXv/4lPz+/Mqd8cudAOmPGDHl7e0uS8vPzNWvWLPtTU9z5KU379u1zWI6OjlZhYWGx9e7sxIkTTq/vq1evnjIzMyuvIBd08OBBTZw4UXXq1NHTTz9tH0A5ePCgvvjiC73yyit67bXX3HZghc9Z2QikLiIrK8shaHXu3FkTJkzQ2LFj1bNnT7cPoz/88IOSkpKUkpKimJgYPfroo4qJidEjjzyi+vXru3UYlaQ6deooKytLXbt2VY8ePTgFdIHY2FiH5a5du5a5j7sYP3686RJc3jXXXKOjR4+qVq1aJW4/cuSIW18/KkkJCQlq2bKlnn/+eYd/j6OiotS5c2f9/e9/V0JCgp577jmDVZrD56xsBFIXMXz4cHXs2FGDBg1Sy5Ytmdz8Am+//bbuvvtuPfvss/L39zddjst56623tHPnTiUlJWn8+PEKCwtTz549eajC/3H3Z2hXpIEDB+qNN97Qtddea7qUStOqVSstWrRIL7/8crFpjPLz87VkyRK1atXKUHWuYdu2bXrppZdKHBywWCzq16+fJk2aZKCyqskdP2cEUhcRGhqq7du3KyQkRKGhoW4/Inqhnj17avXq1UpJSVHXrl3VqVMntx+RuFDjxo3VuHFjDRo0SN9//72Sk5P10UcfqV27dnrqqafsp6tRsh9++EEdO3Y0XYbLc8cZCuLi4vTiiy/qmWeeUa9evVSnTh3ZbDYdOnRIq1evltVq1Z///GfTZRqVl5enGjVqlLo9KChIeXl5lVhR1eaOnzMCqYt4++237deOjh49WuHh4SWeVnRXTzzxhAYNGqQNGzYoKSlJ8+bNU6tWrWSz2VRYWGi6PJfi4+Oj2NhYhYaGaunSpVq/fr0GDx7s9oG0oKBAhw4dkpeXlyIiIuzrf/rpJyUkJOjQoUMEUpSoVq1aeu211zR79mwtXLjQYVvLli31+OOPKyQkxFB1riEkJES7du0qtQ/OtgESgdSlNGnSRE2aNNHgwYO1bt06JScnq7CwUHPmzFHnzp3Vvn17t34yiI+Pj7p3767u3bsrPT1dSUlJ2r17t15++WW1adNGHTt2VIcOHUyXaVTRTV/Jyck6c+aMunbtqiFDhrj9aPKBAwc0ZcoUHTt2TJLUrl07DRkyRNOmTVNaWppuuukmvfjii4arhCurXbu2XnrpJWVnZysjI0OSFBYW5vafrSKdO3fW/PnzFRERUWxOzQMHDuijjz5y65sqUTYeHeriiuYfXbt2rbKzs7Vo0SLTJbmUwsJC/fLLL0pMTNTmzZuLjV64iw0bNig5OVkpKSlq1aqVevTooTZt2nAt8v+ZNGmSrFarevfurfXr12v9+vWKiIhQjx49dNttt/HM7XJ49NFH9eabb7rVtW0o29mzZ/XKK69o586datmypcNlDVu3blWjRo00btw4PmsXyR0/Z4yQuri6devq0Ucf1YABA/Tzzz+bLsfleHh4qG3btmrbtq2ysrJMl2PMP/7xD4WEhOiOO+5QjRo1dOTIEX311VfF9uvdu7eB6szbvXu3xo4dq6ioKDVt2lTr169Xv379GLG5BO44o8ULL7xQ4vsOCAhQeHi4evfu7bbTGRXx8fHR+PHj9fnnn2v9+vVKSUmRdG5i/AcffFB33HGH2182VB7u+DkjkLqIuLi4MvexWCxavHhxJVTjeor+cSuLs4vqr2ZF12atW7eu1H0sFovbBtJTp06pZs2aks6FCF9fXzVu3NhwVVWTO55UK+2hGzk5Odq7d69eeOEFjRs3Tk2aNKnkylyLl5eX+vbtq759+5oupcpzx88ZgdRFjBo1qtRtqamp+vLLL93yB7RIfHx8mfu4c2CfMWOG6RJc3unTp+0jNBaLRWfPnlVubq7DPkyRVbaXXnpJwcHBpsuoVGU9p33RokVKSEjQuHHjKqki1zN9+nS1aNFC119/PTcvVQB3/JxxDakLO3z4sBYsWKBNmzapS5cuiouLU2hoqOmyjLgwOBQ5c+aMVq1apS+//FLXXnutpk6dWsmVuYZJkyZp5MiR9kC1cuVK3XLLLapWrZqkcyOE48aN07Rp00yWaczFnIGQpCVLllzhSlzP+Y80dMadH2lYlrS0NMXHx2v27NmmSzFmwoQJ2rlzp6xWq2rXrq3rr79e119/vZo3b24/O+HO+JyVjRFSF3T8+HElJCRozZo1atWqld54441idy26mwtHrgoLC5WUlKRly5bJYrHo8ccfd9sn7UjS5s2bHR5/uWLFCt144432QFpQUKDDhw+bKs84npJSOh5dePk8PDzc+gyWdC6Q5ufna8eOHUpJSdG2bdu0du1aWa1WhYeH28PpjTfeaLpUIy78nG3fvl0NGzbkJq/zEEhdSG5urpYvX66vvvpKUVFRGjdunJo2bWq6LJfz448/atGiRTp58qT69u2r22+/nYvlL+Du/zleqFmzZqZLcFmE9cv3448/uv1NTZLk7e2t5s2bq3nz5pLO3Xmfmpqq//73v/rPf/6j//znP24bSC/8nD366KN65pln3Oou+rIQSF3EJ598ok8++URBQUEaOXJkqRfRu7OUlBQtWLBABw4c0O23366+fftyzR/KJTc3V7/++quOHDkii8Wi2rVrq0WLFm7/c5Sbm6tdu3bJarWqUaNGbj3fcUlWrVpV4vrc3Fzt2bNH//3vfzV69OhKrsp1Wa1Wpaamatu2bdq2bZt27typ4OBgt58nGs4RSF3EwoUL5ePjo7CwMK1Zs0Zr1qwpcT9nNz9dzSZNmqRff/1VPXr00F//+lcFBQWZLsnlXDhNiDtOG+LMd999p7lz5+r06dMO6wMCAjR06FB16tTJUGVm7du3T5MmTVJmZqYkyc/PT3/5y1/UunVro3W5ki+++KLE9UXTPsXHxys6OrqSq3ItKSkp9lP1O3fuVEhIiJo1a6abb75ZTz/9tGrVqmW6RLg4AqmL6NatGwHCic2bN8vDw0Pff/+9vv/++1L3++CDDyqxKtcyY8YM+6UL+fn5mjVrlnx9fe3L7mzPnj1699131aVLF91xxx32SbsPHjyoVatW6Z///KciIiIUFRVlutRKt2DBAtWuXVvPP/+8vL299fHHH2vu3Ll65513TJfmMpjFomzx8fEKCQnR3XffrZEjRzJogHIjkLqIESNGmC7BpT311FOmS3BpF97Q1bVr1zL3cSdfffWV2rVrV+xz1rBhQ/35z3+2z9YwfPhwQxWas2fPHo0ZM0YNGzaUdO6zNnjwYOXm5rr9pQy4eHfddZdSUlL04Ycf6uuvv1azZs3sf7gERNq/f7/DctFTrPLy8hzWR0ZGVmZZLoVAiiqhe/fupktwae4YpMpjx44devzxx0vdfsstt2jOnDmVWJHryM7OdjidWq1aNfn6+io7O5tA+n9ycnK0fv163XrrrZKkd955R2fPnrVv9/Dw0JNPPmmf1cIdDRgwQJKUl5en33//Xdu2bdOnn36qf/zjH4qIiFDTpk3VvHlzdezY0XClZrzwwgvF1k2ZMqXYOneceq4IgRRXhRMnTmj58uVOQwfc1/HjxxUREVHq9oiICB0/frwSK3ItBw8etF9DKsl+OcP519u688jNt99+q3379tkD6c8//6xWrVrJ399f0rmHl3zxxRd64IEHTJbpEvz8/BQTE6OYmBhJ537h+fzzz/Xll1/qm2++cdvANX36dNMluDwCKaqMtLQ0bdu2TV5eXvY5Nk+ePKnly5frm2++YfoMlOrs2bNOpwbz8vJyGPFyNxMnTiy27sLRG3cNEpL0ww8/6MEHH3RY9/DDD9v/zdm4caOWLVtGINW5OaJ3796tbdu2KSUlRTt27FBeXp5CQkLc+i57d32oTXkQSFEl/Pzzz5o6daoKCwslnZsm68knn9S0adPUsGFD/fWvf+WuYDi1ZcuWUk9B5+TkVHI1ruNiRm4unJnA3fzxxx8OI+wRERHy8vr//31GRkYqPT3dRGku45NPPlFKSoq2b9+uvLw8BQcHq1mzZho4cKCaN2+u2rVrmy7RqJMnT+rMmTMOwTQtLU2fffaZ8vLy1L59e3Xp0sVgheYRSFElfPzxx+rVq5cefPBBffvtt5o/f74++OADjR49Wo0aNTJdHqoA7pQuWWkjN6dPn9b69euVmJio3bt3u/UI6ZkzZxweXzx58uRi2939YRSrVq1Ss2bN9Mgjj6h58+YKCwszXZJLmTt3roKDg/Xoo49KkrKysjRu3DgFBwfr2muv1YwZM1RYWKhu3boZrtQcAimqhMOHD2vkyJHy8/PT7bffro8++kgDBw4kjOKiuHOYKq+UlBQlJibqxx9/VHBwsNq3b6/BgwebLsuoa6+9Vnv37i31Ec67d+92+xHAmTNnmi7Bpe3cudNhlo81a9YoMDBQb7zxhjw9PfXpp59q9erVBFLA1eXl5dlvIPDw8JCPjw/XjAIVJDMzU8nJyUpMTNTp06d14403ymq16q9//SuPxJTUrl07LV68WK1atSo2v2ZmZqYSEhLcelo1iVPSZcnMzHTozbZt29ShQwd5enpKktq2bauVK1caqs41EEhRZZx/DaDNZtPWrVuVlpbmsE/btm1NlIYq4rffftOPP/6oo0ePSpJq166tjh07uvWz7idPnqzff/9dbdq00aBBg9S6dWt5eHjom2++MV2ay7j77rv1448/auTIkeratav9etLDhw9r7dq1Cg4O1t133224SrM4Je1cQECAcnJy7KF0165d6tGjh327xWJx+weYEEhRZVx4DeCsWbOK7cOpWZTm/fff17fffqtq1aopPDxc0rnpelavXq1evXq57WnpzZs36/bbb9ett95q7wsc+fv765VXXtHChQu1fv16+/WkAQEB6ty5s/r3728/g+OuOCXtXOPGjfXll1/qySef1MaNG3X69Gk1b97cvj09PV0hISEGKzSPQIoqgaCJy7Fx40YlJyfrqaeeUmxsrP0xvYWFhUpOTtbs2bPVsmVLtxxhnzhxohITE/Xiiy+qTp066tatmzp16mS6LJcTGBioJ554QkOHDtXJkyclSdWrV+eRz/+HU9LOPfDAA3rllVe0du1aFRQUqF+/fgoMDLRvX79+vZo2bWqwQvMIpACueklJSerTp0+xJ355eHioZ8+eOnz4sBITE90ykEZHRys6OlqDBg3Shg0blJSUpHnz5qmwsFC//vqratWq5fajf+ezWCyqUaOG6TJcDqeknYuKitK0adO0Y8cOBQUFqXHjxg7bO3fu7PbXaxNIUSXMnj1bDz/8sPz8/CRJ69atU9u2be3LOTk5eueddzR69GiTZcJF7d27V/fee2+p2zt06KCpU6dWYkWux8/PTz179nQI6CtXrtSCBQvUsmVL/e1vfzNdojEvvPDCRY2ElvQoSHfBKWnnUlNTderUKbVr186+bs2aNUpISNCZM2fUrl07tWjRwmCF5hFIUSV88803uv/+++0BdNasWWrcuLF9OT8/X5s3bzZYIVzZqVOnFBwcXOr2WrVq6dSpU5VYkWuLiIjQww8/rP79++vnn39WUlKS6ZKMOj9EoGRxcXGaOHEip6RLsWzZMjVr1kw33HCDJOnAgQN67733FBsbq7p16+rTTz9VzZo13fppXwRSVEnuPgk1ysdqtTo8WedC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",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot distibution of tags\n",
    "import matplotlib.pyplot as plt\n",
    "# use ggplot style defaults and set the default figure size\n",
    "plt.style.use('ggplot')\n",
    "plt.rcParams['figure.figsize'] = (8, 5)\n",
    "# sort stats by value descending\n",
    "sorted_stats = {k: v for k, v in sorted(stats[\"stats\"].items(), key=lambda item: item[1], reverse=True)}\n",
    "plt.bar(sorted_stats.keys(), sorted_stats.values())\n",
    "# add title to the plot\n",
    "plt.title(\"Distribution of PII tags\")\n",
    "# rotate xlabels\n",
    "plt.xticks(rotation=90)\n",
    "# use black ticks\n",
    "#plt.tick_params(colors='black')\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.10.4 ('venv')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.4"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "fd8fde6f83dada9276d12fdb71d773558994168ed1b3bea457b8db38c02aa2e1"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
